package cn.mujiankeji.mbrowser.数据.数据库

import androidx.room.ColumnInfo
import androidx.room.Dao
import androidx.room.Entity
import androidx.room.PrimaryKey
import androidx.room.TypeConverter
import androidx.room.TypeConverters
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import androidx.room.Update
import cn.mujiankeji.mbrowser.工具.JSON
import kotlinx.serialization.Serializable
import kotlinx.coroutines.flow.Flow
import kotlinx.serialization.Transient
import java.util.UUID

@Entity
@TypeConverters(搜索引擎项目列表转换器::class)
data class DBSearchEngine(
    @PrimaryKey(autoGenerate = true)
    var id: Long = 0,

    @ColumnInfo(name = "name", defaultValue = "")
    var 名称 : String = "",

    @ColumnInfo(name = "msg", defaultValue = "NULL")
    var 说明 : String? = null,

    @ColumnInfo(name = "version", defaultValue = "0")
    var 版本 : Int = 0,

    @ColumnInfo(name = "pos")
    var 排序 : Int = 0,

    @ColumnInfo(name = "url_size", defaultValue = "0")
    var 引擎数量 : Int = 0,

    @ColumnInfo(name = "urls")
    var 地址列表 : MutableList<搜索引擎项目> = mutableListOf()
)


@Serializable
data class 搜索引擎项目(var 名称 : String,var 地址: String,
                        var POST : String?=null,var 编码 : String?=null)

class 搜索引擎项目列表转换器 {
    @TypeConverter
    fun from搜索引擎项目列表(value: MutableList<搜索引擎项目>?): String? {
        return value?.let { JSON.encodeToString(it) }
    }

    @TypeConverter
    fun to搜索引擎项目列表(value: String?): MutableList<搜索引擎项目>? {
        return value?.let { JSON.decodeFromString<MutableList<搜索引擎项目>>(it) }
    }
}

/**
 * 处理仓库操作
 */
@Dao
interface DaoSearchEngine{
    @Query("SELECT * FROM DBSearchEngine ORDER BY pos ASC")
    fun 获取所有搜索引擎(): Flow<List<DBSearchEngine>>

    /**
     * @param 数量 : Int
     * @return Flow<List<搜索引擎字段>>   ，以排序为准，取指定数量引擎
     */
    @Query("SELECT * FROM DBSearchEngine ORDER BY pos ASC LIMIT :数量")
    fun 获取搜索引擎(数量: Int): Flow<List<DBSearchEngine>>

    @Query("SELECT * FROM DBSearchEngine WHERE id = :id")
    fun 根据Id获取搜索引擎(id: Long): Flow<DBSearchEngine?>

    @Query("SELECT * FROM DBSearchEngine WHERE id = :id")
    suspend fun get(id : Long) : DBSearchEngine?


    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun 插入搜索引擎(搜索引擎: DBSearchEngine): Long

    @Update
    suspend fun 更新搜索引擎(搜索引擎: DBSearchEngine)

    @Delete
    suspend fun 删除搜索引擎(搜索引擎: DBSearchEngine)

    @Query("DELETE FROM DBSearchEngine")
    suspend fun 清空所有搜索引擎()
}

